"""
闭包条件
1、嵌套函数
2、内部函数引用外部函数变量
3、在外部函数返回内部函数名
4、
优点：
    1、结构简单清晰明了
    2、延长函数的作用域
    3、闭包是理解装饰器的基础
    4、可以使用同级作用域
缺点：
    1、变量作用域没有那么直观
    2、外部函数的局部变量不会被垃圾回收机制及时回收，有一定的内存占用
"""

a = 100
def func():
    b = 101
    def inner_func():
        c = 102
        sum = a+b+c
        print(sum)
    print(locals())

    return inner_func

x = func()
print(x)
print(x())

def func1():
    """计数器"""
    con = [0]
    def add_one():
        con[0] += 1
        print("第{}次调用".format(con[0]))
    return add_one

x = func1()
x()
x()
x()

def func2():
    a = 100

    def inner_func1():
        b = 90
        s = a + b
        print(s)

    def inner_func2():
        inner_func1()
        print("---------->inner_func2",a)
        s = "hello inner_func2!!!"
        return s
    return inner_func2

f =  func2()
print(f)
f2 = f()
print(f2)